// 按钮状态管理工具
import { reactive } from 'vue'

// 全局按钮处理状态管理
const globalButtonStates = reactive(new Map())

/**
 * 按钮状态管理类
 */
export class ButtonStateManager {
  constructor() {
    this.processingButtons = new Map()
    this.debounceTimers = new Map()
  }

  /**
   * 检查按钮是否正在处理中
   * @param {string} buttonKey - 按钮唯一标识
   * @returns {boolean}
   */
  isProcessing(buttonKey) {
    return this.processingButtons.has(buttonKey)
  }

  /**
   * 设置按钮处理状态
   * @param {string} buttonKey - 按钮唯一标识
   * @param {boolean} isProcessing - 是否正在处理
   */
  setProcessing(buttonKey, isProcessing) {
    if (isProcessing) {
      this.processingButtons.set(buttonKey, true)
    } else {
      this.processingButtons.delete(buttonKey)
    }
  }

  /**
   * 防抖处理函数
   * @param {string} buttonKey - 按钮唯一标识
   * @param {Function} callback - 回调函数
   * @param {number} delay - 延迟时间（毫秒）
   */
  debounce(buttonKey, callback, delay = 300) {
    // 如果正在处理中，直接返回
    if (this.isProcessing(buttonKey)) {
      return
    }

    // 清除之前的定时器
    if (this.debounceTimers.has(buttonKey)) {
      clearTimeout(this.debounceTimers.get(buttonKey))
    }

    // 设置新的定时器
    const timer = setTimeout(() => {
      this.debounceTimers.delete(buttonKey)
      callback()
    }, delay)

    this.debounceTimers.set(buttonKey, timer)
  }

  /**
   * 清理所有状态
   */
  clear() {
    this.processingButtons.clear()
    this.debounceTimers.forEach(timer => clearTimeout(timer))
    this.debounceTimers.clear()
  }
}

/**
 * 创建批次按钮状态管理器
 * @param {string} batchId - 批次ID
 * @returns {ButtonStateManager}
 */
export function createBatchButtonManager(batchId) {
  const key = `batch_${batchId}`
  if (!globalButtonStates.has(key)) {
    globalButtonStates.set(key, new ButtonStateManager())
  }
  return globalButtonStates.get(key)
}

/**
 * 获取按钮的CSS类名
 * @param {string} buttonKey - 按钮唯一标识
 * @param {boolean} isProcessing - 是否正在处理
 * @param {string} baseClass - 基础CSS类名
 * @returns {string}
 */
export function getButtonClass(buttonKey, isProcessing, baseClass = '') {
  const classes = [baseClass]

  if (isProcessing) {
    classes.push('processing')
  }

  return classes.filter(Boolean).join(' ')
}
